home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / ln03 / rmcs / ginotosix.for < prev    next >
Text File  |  1989-06-06  |  4KB  |  160 lines

  1.      IMPLICIT NONE
  2. C PROGRAM DESCRIPTION: 
  3. C     Converts a GINO SAVDRA file into a sixel file suitable for importing
  4. C     into TeX via the /special{SX filename} command
  5. C AUTHORS: 
  6. C     Sqn Ldr J P Baggott MBE MA CEng MIEE RAF
  7. C CREATION DATE:     1 Dec 88
  8. C         C H A N G E   L O G
  9. C     Date     | Name  | Description
  10. C ----------------+-------+-----------------------------------------------------
  11. C
  12. C
  13. C
  14.     CHARACTER*4096    LINE        !Line buffer
  15.     INTEGER*4    COUNT        !Number of chars in line
  16.     INTEGER*4    START        !Start of outpur line in buffer
  17.     INTEGER*4    ILLEGAL        !Position of illegal sequence in buffer
  18.     INTEGER*4    STATE        !Window state retuned by WINENQ
  19.     INTEGER*4    SEGMENT        !Segment number in saved drawing
  20.     REAL*4        SAVEDWINDOW(4)    !Window bounds of saved drawing
  21.     REAL*4        WIDTH        !Desired width
  22.     REAL*4        HEIGHT        !Desired height
  23.     REAL*4        SCALE        !Desired scale factor
  24.     CHARACTER*255    INPUT        !Name of input file
  25.     CHARACTER*255    OUTPUT        !Name of output file
  26.     LOGICAL        FORMFEED    !Do we want a formfeed at the end of the
  27.                     !file?
  28.  
  29.     COMMON/GINOTOSIX/INPUT,OUTPUT,WIDTH,HEIGHT,SCALE,SEGMENT,FORMFEED
  30.  
  31. C    Get the parameters from the command line
  32.      
  33.     CALL CLI
  34.  
  35.     CALL GINO
  36.     
  37. C    First use the dummy driver to find the window size of the saved drawing
  38.  
  39.     CALL DUMMY
  40.  
  41.     OPEN (UNIT=3,
  42.     1   FILE = INPUT,
  43.     1   STATUS = 'OLD',
  44.     1   READONLY)
  45.  
  46.     CALL WINDOW(2)
  47.  
  48.     CALL GETDRA(3,SEGMENT,3,1)
  49.     CALL WINENQ(STATE,1,4,SAVEDWINDOW)
  50.  
  51.     CALL DEVEND
  52.  
  53. C    Now open the LN03 driver and set up the transformations to rotate the
  54. C    picture through 90 degrees and scale it to the user's desired size
  55.  
  56.     IF (HEIGHT.EQ.0.0) HEIGHT = SAVEDWINDOW(4)-SAVEDWINDOW(3)
  57.     IF (WIDTH.EQ.0.0) WIDTH = SAVEDWINDOW(2)-SAVEDWINDOW(1)
  58.     IF (SCALE.EQ.0.0) THEN
  59.         SCALE = WIDTH/(SAVEDWINDOW(2)-SAVEDWINDOW(1))
  60.         SCALE = MIN(SCALE,HEIGHT/(SAVEDWINDOW(4)-SAVEDWINDOW(3)))
  61.     END IF
  62.     
  63.     OPEN (UNIT=1,
  64.     1   FILE = 'GINOTOSIX.TMP',
  65.     1   RECL = 4096,
  66.     1   STATUS  = 'NEW')
  67.  
  68.     OPEN (UNIT=3,
  69.     1   FILE = INPUT,
  70.     1   STATUS = 'OLD',
  71.     1   READONLY)
  72.  
  73.     CALL LN03
  74.  
  75.     CALL LINWID(0.2)
  76.     CALL WINDO2(0.0,HEIGHT,0.0,WIDTH)
  77.     CALL CHASWI(1)
  78.     CALL SCALE2(SCALE,SCALE)
  79.     CALL ROTAT2(90.0)
  80.     CALL SHIFT2(-SAVEDWINDOW(1),-SAVEDWINDOW(4))
  81.     CALL GETPIC(3,SEGMENT)
  82.     CALL DEVEND
  83.  
  84.     CLOSE(3)
  85.  
  86. C    Next, open the sixel file produced by GINO, and prepare to filter it to
  87. C    remove <ESC>c (printer reset), split lines longer than 256 bytes, and
  88. C    remove the FORTRAN carriage controls 
  89.  
  90.     OPEN (UNIT=1,
  91.     1   FILE = 'GINOTOSIX.TMP',
  92.     1   STATUS  = 'OLD',
  93.     1   DISPOSE = 'DELETE')
  94.  
  95.     OPEN (UNIT=2,
  96.     1   FILE = OUTPUT,
  97.     1   ACCESS        = 'SEQUENTIAL',
  98.     1   CARRIAGECONTROL = 'NONE',
  99.     1   FORM        = 'FORMATTED',
  100.     1   RECORDTYPE        = 'VARIABLE',
  101.     1   RECL        = 256,
  102.     1   STATUS        = 'NEW')
  103.     
  104. C    Repeat until end-of-file
  105.  
  106.     DO WHILE (.TRUE.)
  107.     
  108.         READ (1,999,END=500) COUNT,LINE(1:COUNT)
  109.  
  110. C        Remove all occurences of <ESC>c
  111.  
  112.         ILLEGAL = INDEX(LINE(1:COUNT),CHAR(27)//'c')
  113.     
  114.         DO WHILE (ILLEGAL.GT.0)
  115.         IF (ILLEGAL.EQ.COUNT-1) THEN
  116.             IF (COUNT.GT.2) LINE(1:COUNT-2) = LINE(1:ILLEGAL-1)
  117.         ELSE
  118.             LINE(1:COUNT-2) = LINE(1:ILLEGAL-1)//LINE(ILLEGAL+2:COUNT)
  119.         END IF
  120.         COUNT = COUNT-2
  121.         IF (COUNT.GT.2) THEN
  122.             ILLEGAL = INDEX(CHAR(27)//'c',LINE(1:COUNT))
  123.         ELSE
  124.             ILLEGAL = 0
  125.         END IF
  126.         END DO
  127.  
  128. C        Split lines longer than 256 bytes
  129.  
  130.         START=1
  131.  
  132.         DO WHILE (START.LE.COUNT.AND.COUNT.GT.0)
  133.         WRITE(2,998)LINE(START:MIN(START+255,COUNT))
  134.         START = START+256
  135.         END DO
  136.     
  137.     END DO
  138.  
  139. 500    IF (FORMFEED) WRITE(2,997) '0C'X
  140.     
  141. C    Close the files and exit
  142.  
  143.     CLOSE(1)
  144.     CLOSE(2)
  145.  
  146.     CALL GINEND
  147.  
  148. 997    FORMAT(A1)
  149. 998    FORMAT(A)
  150. 999    FORMAT(X,Q,A)
  151.     END
  152.